import { NetworkFormData } from './NetworkFormData'
import { Interceptor } from '../interceptors/NetworkInterceptor'

/**
 * 定义一个网络进度事件的接口。
 * 用于描述在进行网络传输时的进度信息。
 * @interface NetworkProgressEvent
 * @property {number} loaded - 代理服务器的主机名或IP地址。
 * @property {number} total - 代理服务器的端口号。
 * @property {number} progress - 进度百分比。
 * @property {number} bytes - 传输的字节数。
 * @property {number} rate - 数据传输速率，单位为字节/秒。
 * @property {number} estimated - 估计的完成时间，单位为毫秒。
 * @property {boolean} upload - 是否为上传事件。
 * @property {boolean} download - 是否为下载事件。
 * @property {any} event - 原生的事件对象。
 */
interface NetworkProgressEvent {
  loaded: number;
  total?: number;
  progress?: number;
  bytes: number;
  rate?: number;
  estimated?: number;
  upload?: boolean;
  download?: boolean;
  event?: any;
}

/**
 * 定义一个网络代理配置的接口。
 *
 * @interface NetworkProxyConfig
 * @property {string} host - 代理服务器的主机名或IP地址。
 * @property {number} port - 代理服务器的端口号。
 * @property {Array<string>} exclusionList - 不经过代理服务器的域名或URL列表。
 */
interface NetworkProxyConfig {
  host: string;
  port: number;
  exclusionList: Array<string>;
}

/**
 * 定义一个网络请求的接口
 *
 * 该接口用于描述进行网络请求时的各种配置选项。
 * @interface NetworkRequest
 * @property {string} url - 请求的URL地址。
 * @property {string} method - 请求的方法，如GET、POST等。
 * @property {string} baseURL - 请求的基地址。
 * @property {Record<string, string>} headers - 请求的HTTP头信息。
 * @property {any} params - 请求的参数。
 * @property {any} data - 请求的数据。
 * @property {NetworkProxyConfig} proxy - 请求的代理配置。
 * @property {number} timeout - 请求超时时间，单位为毫秒。
 * @property {(progressEvent: NetworkProgressEvent) => void} onUploadProgress - 上传进度回调函数。
 * @property {(progressEvent: NetworkProgressEvent) => void} onDownloadProgress - 下载进度回调函数。
 * @property {(status: number) => boolean} validateStatus - 验证响应状态码的函数。
 * @property {Interceptor[]} interceptors - 请求拦截器列表。
 * @property {NetworkInterceptor} networkInterceptor - 网络请求拦截器。
 */
interface NetworkRequest {
  url?: string;
  method?: string;
  baseURL?: string;
  headers?: Record<string, string>;
  params?: any;
  data?: NetworkFormData | any;
  proxy?: NetworkProxyConfig | boolean;
  timeout?: number;
  onUploadProgress?: (progressEvent: NetworkProgressEvent) => void;
  onDownloadProgress?: (progressEvent: NetworkProgressEvent) => void;
  validateStatus?: ((status: number) => boolean) | null;
  interceptors?: Interceptor[]
}

/**
 * 判断指定的HTTP方法是否需要将参数编码为URL的一部分。
 * @param method - 指定的HTTP方法，不区分大小写，默认为'get'。
 * @returns 返回一个布尔值，如果方法为'get'、'delete'或'head'之一，则返回true，否则返回false。
 */
function encodesParametersInURL(method: string = 'get'): boolean {
  method = method.toLowerCase()
  if (method === 'get' || method === 'delete' || method === 'head') {
    return true
  }
  return false
}

function mutableCopy(request: NetworkRequest): NetworkRequest {
  return { ...request }
}

export { NetworkProgressEvent,
  NetworkProxyConfig,
  NetworkFormData,
  NetworkRequest,
  encodesParametersInURL,
  mutableCopy }
